#include "CruiseControl.h";
/*
--------------------------interne opdrachten--------------------------
*/

void STDMaken(cruiseControl *cc)
{
	if((*cc).cruiseSTD==NULL)
	{
		//Reserveer geheugen
		(*cc).cruiseSTD=(STD*)malloc(sizeof(STD));
		//maak STD
		create_STD((*cc).cruiseSTD,3,defaultActie);
		//Alle mogelijke overgangen toevoegen
		addTransition_STD((*cc).cruiseSTD, inactief, activatieknopIndrukken, actief, action0);
		addTransition_STD((*cc).cruiseSTD, actief, activatieknopIndrukken, inactief, action1);
		addTransition_STD((*cc).cruiseSTD, actief, PedaalIndrukken, inactief, action2);
		addTransition_STD((*cc).cruiseSTD, pauze, Pauzeren, actief, action3);
		addTransition_STD((*cc).cruiseSTD, actief, Pauzeren, pauze, action4);
		addTransition_STD((*cc).cruiseSTD, actief, Snelheidverhogen, actief, action5);
		addTransition_STD((*cc).cruiseSTD, actief, Snelheidverlagen, actief, action6);	
		addTransition_STD((*cc).cruiseSTD, actief, SnelheidControleren, actief, action7);

		(*cc).status = inactief; //bij systeem start is de status van de cruise control inactief
	}
}

/*
--------------------------openbare opdrachten--------------------------
*/

//geeft de mailbox van de sensorInput
mailBox* Get_sensorInput(cruiseControl cc)
{
	return GiveInput(cc.sens);
}

//geeft de mailbox van de outputOut
mailBox* Get_outputOut(cruiseControl cc)
{
	return GiveOutputOut(cc.out);
}

//initialiseert de cruise control en zijn onderdelen
void CruiseInit(cruiseControl* cc)
{
	(*cc).taak = (task*)malloc(sizeof(task)); //maak ruimte voor de taak
	sensorInit(&(*cc).sens); //start de sensor init
	outputInit(&(*cc).out); //start de output init
}

//zorgt ervoor dat het systeem zijn werk kan doen
unsigned __stdcall autostart(void* arg){
	task* t = (task*) arg; //haal de taak op
	cruiseControl *cc = (cruiseControl *)getArgument_task(t); //haal de parameter op
	create_task((*cc).sens.taak, inputStart, &(*cc).sens, sizeof(sensor), 0); //start de sensor
	create_task((*cc).out.taak, outputStart, &(*cc).out, sizeof(output), 0); //start de ouput
	while(!isTerminated_task(t)){

	}
	return 0;
}

//verwijdert de taak van cruise control
void CruiseDelete(cruiseControl* cc)
{
	delete_task((*cc).taak);	
	delete_STD((*cc).cruiseSTD);
	sensorDelete(&(*cc).sens);
	outputDelete(&(*cc).out);
}